package com.jgc.blockingqueue;

import java.util.TreeMap;
import java.util.concurrent.SynchronousQueue;

/**
 * SynchronousQueue 是 Java 中的一个特殊的队列实现，它用于在生产者线程和消费者线程之间传递元素。
 * 与其他队列不同，SynchronousQueue 的容量始终为 0。
 * 它不会实际存储任何元素，而是在生产者线程尝试将元素放入队列时，等待一个消费者线程来取走该元素。
 *
 * 生产者线程在尝试将元素放入队列时，如果没有消费者线程来取走该元素，生产者线程将被阻塞，直到有消费者线程来取元素。
 * 消费者线程在尝试从队列中取出元素时，如果没有生产者线程放入元素，消费者线程也会被阻塞，直到有生产者线程放入元素。
 */
public class SynchronousQueueTest {
    // 任务类
    static class Task {
        private String name;
        private String description;

        public Task(String name, String description) {
            this.name = name;
            this.description = description;
        }

        public String getName() {
            return name;
        }

        public String getDescription() {
            return description;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SynchronousQueue<Task> synchronousQueue = new SynchronousQueue<>();
        Thread producer = new Thread(() -> {
            try {
                // 创建并放入多个任务
                for (int i = 1; i <= 3; i++) {
                    Task task = new Task("Task " + i, "Do something " + i);
                    System.out.println("Producer is putting task: " + task.getName() + " into the queue...");
                    synchronousQueue.put(task);
                    System.out.println("Producer has put the task into the queue: " + task.getName());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        });
        // 创建消费者线程
        Thread consumer = new Thread(() -> {
            try {
                // 消费者线程依次取出任务并执行
                for (int i = 1; i <= 3; i++) {
                    System.out.println("Consumer is trying to take a task from the queue...");
                    Task task = synchronousQueue.take();
                    System.out.println("Consumer has taken the task from the queue: " + task.getName() + " - " + task.getDescription());
                    // 执行任务
                    System.out.println("Consumer is executing the task: " + task.getName());
                    // 这里可以根据任务的具体内容执行相应的操作
                    System.out.println("Task executed successfully: " + task.getName());
                    Thread.sleep(1000); // 为了演示，每放入一个任务后暂停一秒钟

                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        // 启动生产者和消费者线程
        producer.start();
        consumer.start();
        producer.join();
        consumer.join();
    }

}
